package awk.polymorphic.genericofUpanddown;


import awk.model.fruit.Apple;
import awk.model.fruit.Fruit;

/**
 * 1、extends 上边界不能放，因为上边界作用下，不知道要放什么样的类型 所以会报错，但是可以取：能取不能存
 * 2、super 下边界不能取，因为在下边界的作用下，不知道要取出来什么样的数据（本身类型,object） 但是可以放。能存不能取（取出的是Object）
 */
public class Test {
	//上界通配符
	//当泛型T给定 A类型到A类型任何子类的限制域，可以匹配任何在此限制域中的类型，此种表示叫上边界通配符。
	class Plate<T extends Fruit> {
		private T item;
		public Plate(T t) {
			item = t;
		}

		public void set(T t) {
			item = t;
		}

		public T get() {
			return item;
		}
	}

	public void testOne() {
		Plate<? extends Fruit> p = new Plate<>(new Apple());
		//p.set(new Apple()); //上界通配符不能放,会报错
		Fruit fruit = p.get();
	}

	//下界通配符
	class PlateNew<T> {
		private T item;
		public PlateNew(T t) {
			item = t;
		}
		public void set(T t) {
			item = t;
		}
		public T get() {
			return item;
		}
	}

	public void testTwo() {
		//当泛型T给定 A类型到A类型任何父类的限制域，可以匹配任何在此限制域中的类型，此种表示叫下边界通配符。
		PlateNew<? super Fruit> p = new PlateNew<>(new Fruit());
		//存入元素正常
		p.set(new Fruit());
		p.set(new Apple());

		//读取出来的东西只能存放在Object类里。
//		Apple newFruit3=p.get();    //Error
//		Fruit newFruit1=p.get();    //Error
		Object newFruit2 = p.get();
	}

}
